﻿using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using WpfDryIocDemo.Models;
using WpfDryIocDemo.Services;

namespace WpfDryIocDemo.ViewModels
{
    // 实现 INotifyPropertyChanged 接口，支持界面数据绑定
    public class MainViewModel : INotifyPropertyChanged
    {
        // 依赖注入业务服务
        private readonly UserService _userService;

        // 绑定界面的用户列表
        private List<User> _userList;
        public List<User> UserList
        {
            get => _userList;
            set
            {
                _userList = value;
                OnPropertyChanged();
            }
        }

        // 绑定界面的输入字段（新增/修改用户）
        private string _inputName;
        public string InputName
        {
            get => _inputName;
            set
            {
                _inputName = value;
                OnPropertyChanged();
            }
        }

        private int _inputAge;
        public int InputAge
        {
            get => _inputAge;
            set
            {
                _inputAge = value;
                OnPropertyChanged();
            }
        }

        // 当前选中的用户（用于修改/删除）
        private User _selectedUser;
        public User SelectedUser
        {
            get => _selectedUser;
            set
            {
                _selectedUser = value;
                OnPropertyChanged();
                // 选中用户时，自动填充输入框
                if (value != null)
                {
                    InputName = value.Name;
                    InputAge = value.Age;
                }
            }
        }

        // 构造函数：注入 UserService（由 DryIOC 提供）
        public MainViewModel(UserService userService)
        {
            _userService = userService;
            LoadUsers(); // 初始化加载用户列表
        }

        // 加载所有用户（绑定到界面按钮）
        public void LoadUsers()
        {
            UserList = _userService.GetAllUsers();
        }

        // 新增用户（绑定到界面按钮）
        public void AddUser()
        {
            var newUser = new User { Name = InputName, Age = InputAge };
            bool success = _userService.AddUser(newUser);
            if (success)
            {
                LoadUsers(); // 新增成功后刷新列表
                ClearInput(); // 清空输入框
            }
            else
            {
                System.Windows.MessageBox.Show("新增失败！姓名不能为空，年龄不能为负。");
            }
        }

        // 修改用户（绑定到界面按钮）
        public void UpdateUser()
        {
            if (SelectedUser == null)
            {
                System.Windows.MessageBox.Show("请选择要修改的用户！");
                return;
            }

            var updatedUser = new User
            {
                Id = SelectedUser.Id,
                Name = InputName,
                Age = InputAge,
            };

            bool success = _userService.UpdateUser(updatedUser);
            if (success)
            {
                LoadUsers();
                ClearInput();
            }
            else
            {
                System.Windows.MessageBox.Show("修改失败！姓名不能为空，年龄不能为负。");
            }
        }

        // 删除用户（绑定到界面按钮）
        public void DeleteUser()
        {
            if (SelectedUser == null)
            {
                System.Windows.MessageBox.Show("请选择要删除的用户！");
                return;
            }

            bool confirm =
                System.Windows.MessageBox.Show(
                    $"确定要删除用户「{SelectedUser.Name}」吗？",
                    "确认删除",
                    System.Windows.MessageBoxButton.YesNo
                ) == System.Windows.MessageBoxResult.Yes;

            if (confirm)
            {
                _userService.DeleteUser(SelectedUser.Id);
                LoadUsers();
                ClearInput();
            }
        }

        // 清空输入框
        private void ClearInput()
        {
            InputName = string.Empty;
            InputAge = 0;
            SelectedUser = null;
        }

        // INotifyPropertyChanged 接口实现（通知界面数据更新）
        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
